该文章为 spring boot jpa 项目开发实战记录,在项目开发中记录着需要注意和复用的地方,方便 jpa 使用者复用,提高开发效率。

一、jpa 动态查询 + 排序 + 分页(非注解)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Override
public Page<TsDbMeta> getTsDbInfo(String name, Boolean createInstance, String description, PageRes<TsDbMeta> pageRes) {

Sort sort = Sort.by(Sort.Direction.DESC, "createTime");
Pageable pageable = PageRequest.of(pageRes.getPageNum() - 1, pageRes.getPageSize(), sort);

return tsDbMetaRepository.findAll((root, query, criteriaBuilder) -> {
List<Predicate> list = new ArrayList<>();

if (StrUtil.isNotBlank(name)) {
list.add(criteriaBuilder.equal(root.<String>get("name"), name));
}
if (createInstance != null) {
list.add(criteriaBuilder.equal(root.<String>get("createInstance"), createInstance));
}
if (StrUtil.isNotBlank(description)) {
list.add(criteriaBuilder.like(root.<String>get("description"), "%" + description + "%"));
}
Predicate[] p = new Predicate[list.size()];
return criteriaBuilder.and(list.toArray(p));

}, pageable);
}

二、jpa 其它问题

1、设置 Date 类型自动转 13 位时间戳

1
2
3
4
spring:  # 设置Date类型自动转13位时间戳
jackson:
serialization:
write-dates-as-timestamps: true

2、如果想让返回的数据时间字段为 yyyy-MM-dd 格式

可以在对应实体类中添加注解:

1
@JsonFormat(timezone="GMT+8", pattern="yyyy-MM-dd")

3、jpa 自动更新实体创建时间和修改时间

1)实体类中

  • 需要在实体类属性上加注解:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;

/**
* 创建时间
*/
@CreatedDate
private Date createTime;

/**
* 修改时间
*/
@LastModifiedDate
private Date modifyTime;
  • 实体类头上加注解:
1
2
3
4
5
6
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

@EntityListeners(AuditingEntityListener.class)
public class AccessClientid {
...
}
  • Spring Boot 启动类加注解:
1
2
3
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

@EnableJpaAuditing

4、设置 jpa sql 语句显示查询参数值

1
2
3
4
# jpa sql 语句显示查询参数值
logging:
level:
org.hibernate.type.descriptor.sql.BasicBinder: trace

5、在控制台格式化输出 sql 语句

1
2
3
4
5
6
spring:  
jpa:
properties:
hibernate:
show_sql: true # 在控制台打印出sql语句
format_sql: true # 在控制台格式化输出sql语句

6、JPA 复合主键使用

1)表结构:
1
2
3
4
5
6
7
CREATE TABLE `gateway_points_day_count` (
`stat_time` date NOT NULL COMMENT '日期,格式YYYY-MM-DD',
`tenant_id` varchar(30) NOT NULL,
`namespace` varchar(100) NOT NULL,
`num_points` int(11) DEFAULT 0,
PRIMARY KEY (`stat_time`,`tenant_id`,`namespace`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

有一个三个字段的复合主键。

2)JPA 实体类

在实体类上添加注解:@IdClass(GatewayPointsDayCountIds.class),然后作为主键的字段上添加注解:@Id。如下图所示:

创建 GatewayPointsDayCountIds 类,该类的属性都是上个实体类里面的主键字段。如下图所示:

三、多表联合查询

待补充。